﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Threading;

namespace WCF_DuplexSvc
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class DuplexSvc : IDuplexSvc
    {
        TaxiQueue queue = new TaxiQueue();

        public void AddToQueue(int idTaxist, int idRegion)
        {
            queue.AddToQueue(idTaxist, idRegion);

        }

        public int GetDriver(int idRegion)
        {
            queue.callback = OperationContext.Current.GetCallbackChannel<IClientCallback>();
            int driver = queue.GetDriverFromQueue(idRegion);
            return driver;
        }


        public void RemoveFromQueue(int idTaxist)
        {
            queue.RemoveFromQueue(idTaxist);
        }
    }

    /*метод SendTimeToCLient() будет вызван после обращения клиента к нашей службе. Он подождет до начала следующей минуты и начнет отправлять клиенту сообщения с периодичностью period миллисекунд, всего таких сообщений он отправит number. Каждое из этих сообщений доставляется клиенту методом ReceiveTime() */

    public class TaxiQueue
    {
        //член типа контракта обратного вызова

        public IClientCallback callback = null;

        List<KeyValuePair<int, int>> queue = new List<KeyValuePair<int, int>>();

        public void AddToQueue(int idTaxist, int idRegion) {
            KeyValuePair<int, int> t = new KeyValuePair<int, int>(idTaxist, idRegion);
            queue.Add(t);
        }
        public void RemoveFromQueue(int idTaxist) {
            for (int i = 0; i < queue.Count; i++)
            {
                if (queue[i].Key == idTaxist)
                {
                    queue.RemoveAt(i);
                    break;
                }
            }
        }
        public int GetDriverFromQueue(int idRegion) {
            int driverId = -1;
            List<int> disagree = new List<int>();
            for (int i = 0; i < queue.Count;i++)
            {
                if (queue[i].Value == idRegion)
                {
                    if (!callback.CheckDriver(queue[i].Key))
                    {
                        continue;
                    } else {
                        driverId = queue[i].Key;
                        break;
                    }
                }
            }
            if (driverId != -1) {
                RemoveFromQueue(driverId);
            }
            return driverId;
        }
    }

}
